﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Cash.View.Administracao
{
    public partial class ControlePermissao : BasePageCash
    {
        private System.Linq.IQueryable carregaPesquisa()
        {
            try
            {
                List<int> listPagina = new List<int>();
                if (ddlNomePagina.SelectedIndex == 0)
                {
                    foreach (ListItem item in ddlNomePagina.Items)
                    {
                        listPagina.Add(int.Parse(item.Value));
                    }
                }
                else
                {
                    listPagina.Add(int.Parse(ddlNomePagina.SelectedValue));
                }

                List<int> listPerfil = new List<int>();
                if (ddlNomePerfil.SelectedIndex == 0)
                {
                    foreach (ListItem item in ddlNomePerfil.Items)
                    {
                        listPerfil.Add(int.Parse(item.Value));
                    }
                }
                else
                {
                    listPerfil.Add(int.Parse(ddlNomePerfil.SelectedValue));
                }

                var query = from perpag in cashEntity.PERFIL_PAGINA
                            join pag in cashEntity.PAGINA on perpag.ID_PAGINA equals pag.ID_PAGINA
                            join per in cashEntity.PERFIL on perpag.ID_PERFIL equals per.ID_PERFIL
                            join pai in cashEntity.PAGINA on pag.ID_PAGINA_PAI equals pai.ID_PAGINA
                            where listPagina.Contains(perpag.ID_PAGINA) &&
                                    listPerfil.Contains(perpag.ID_PERFIL)
                            orderby pag.NOME
                            select new
                            {
                                Id = perpag.ID_PERFIL_PAGINA,
                                Pagina = pag.NOME,
                                Perfil = per.NOME,
                                Url = pag.URL,
                                Status = pag.STATUS.DESCRICAO,
                                Data = perpag.DATA_CADASTRO,
                                Menu = pai.NOME + " -> " + pag.NOME
                            };
                return query;
            }
            catch (Exception)
            {
                return null;
            }
        }

        private void carregaGrid()
        {
            grvPesquisa.Columns[1].Visible = true;
            grvPesquisa.Columns[2].Visible = true;
            grvPesquisa.DataSource = carregaPesquisa();
            grvPesquisa.DataBind();
            grvPesquisa.Columns[1].Visible = false;
            if (ddlNomePerfil.SelectedItem.Text != "<< Selecione >>")
            {
                grvPesquisa.Columns[2].Visible = false;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ddlNomePerfil.DataSource = cashEntity.PERFIL;
                ddlNomePerfil.DataTextField = "NOME";
                ddlNomePerfil.DataValueField = "ID_PERFIL";
                ddlNomePerfil.DataBind();
                ddlNomePerfil.Items.Insert(0, new ListItem("<< Selecione >>", "0"));

                ddlNomePagina.DataSource = cashEntity.PAGINA.Where(c => c.ID_STATUS == 1).OrderBy(c => c.NOME);
                ddlNomePagina.DataTextField = "NOME";
                ddlNomePagina.DataValueField = "ID_PAGINA";
                ddlNomePagina.DataBind();
                ddlNomePagina.Items.Insert(0, new ListItem("<< Selecione >>", "0"));
            }

            carregaGrid();
        }

        protected void ddlPerfil_SelectedIndexChanged(object sender, EventArgs e)
        {
            carregaGrid();
            if (grvPesquisa.Rows.Count == 0)
            {
                lblErro.Text = "A pesquisa não retornou nenhum registro.";
                lblErro.Visible = true;
            }
            else
            {
                lblErro.Visible = false;
                lblErro.Text = "";
            }
        }

        protected void btnAdicionar_Click(object sender, EventArgs e)
        {

            ErroValidacao += Validacao.SelecioneDropDown(ddlNomePagina.SelectedValue, "página");
            ErroValidacao += Validacao.SelecioneDropDown(ddlNomePerfil.SelectedValue, "perfil");

            int valuePagina = Int32.Parse(ddlNomePagina.SelectedValue);
            int valuePerfil = Int32.Parse(ddlNomePerfil.SelectedValue);
            int count = (from perpag in cashEntity.PERFIL_PAGINA
                         where perpag.ID_PAGINA == valuePagina &&
                                perpag.ID_PERFIL == valuePerfil
                         select perpag).Count();
            if (count > 0)
            {
                ErroValidacao += "Permissão já cadastrada.<br/>";
            }

            //TESTE VALIDACAO
            if ("".Equals(ErroValidacao))
            {
                PERFIL_PAGINA perPag = new PERFIL_PAGINA();
                perPag.ID_PAGINA = Int32.Parse(ddlNomePagina.SelectedValue);
                perPag.ID_PERFIL = Int32.Parse(ddlNomePerfil.SelectedValue);
                perPag.ID_STATUS = 1;
                perPag.DATA_CADASTRO = DateTime.Now;

                cashEntity.AddToPERFIL_PAGINA(perPag);
                cashEntity.SaveChanges();
                gravaBitacora("Cadastro", "Liberou permissão -> Pag." + perPag.ID_PAGINA + " -- Perf." + perPag.ID_PERFIL);
            }
            carregaGrid(); 
        }

        protected void grvPesquisa_RowDeleting(Object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                TableCell cell = grvPesquisa.Rows[e.RowIndex].Cells[1];
                int valor = Int32.Parse(cell.Text);
                PERFIL_PAGINA perPag = new PERFIL_PAGINA();
                perPag = cashEntity.PERFIL_PAGINA.Where(c => c.ID_PERFIL_PAGINA == valor).First();

                cashEntity.DeleteObject(perPag);
                cashEntity.SaveChanges();
                gravaBitacora("Exclusao", "Excluiu permissao -> " + perPag.ID_PERFIL_PAGINA + ";" + perPag.ID_PAGINA + ";" + perPag.ID_PERFIL  + ";" + 
                                                perPag.ID_STATUS + ";" + perPag.DATA_CADASTRO);
                lblErro.Visible = true;

                carregaGrid();
            }
            catch (Exception ex)
            {
                gravaBitacora("Erro", "Controle Permissao -> " + ex.Message);
                lblErro.Text = "Erro na exclusão da permissão.";
                lblErro.Visible = true;
            }
        }

        protected void grvPesquisa_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {

            grvPesquisa.Columns[1].Visible = true;
            grvPesquisa.Columns[2].Visible = true;
            grvPesquisa.PageIndex = e.NewPageIndex;
            grvPesquisa.DataSource = carregaPesquisa();
            grvPesquisa.DataBind();
            grvPesquisa.Columns[1].Visible = false;
            if (ddlNomePerfil.SelectedItem.Text != "<< Selecione >>")
            {
                grvPesquisa.Columns[2].Visible = false;
            }
        }
    }
}